"""
from selenium import webdriver：导入 Selenium 的 webdriver 模块，用于控制浏览器。
from selenium.webdriver import Keys：导入 Selenium 的 Keys 类，用于模拟键盘输入操作。
from selenium.webdriver.chrome.service import Service：导入 Service 类，用于管理 ChromeDriver 服务。
from selenium.webdriver.common.by import By：导入 By 类，用于定位元素。
"""
import os
import time
import ddddocr
from selenium import webdriver
from selenium.common import TimeoutException
from selenium.webdriver import Keys
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC1

download_dir = os.path.join(os.getcwd(), 'E:\国家标准网下载内容')  # 设置下载目录

s = Service(
    r'E:\edgedriver_win64 (1)\msedgedriver.exe')  # 创建一个 Service 对象 s，传递 ChromeDriver 的路径作为参数。这里的路径是 ChromeDriver 可执行文件的位置。
driver = webdriver.Edge(service=s)  # 创建一个 Chrome 浏览器实例 driver，并指定 Service 对象 s 以启动 ChromeDriver 服务。
driver.get('https://openstd.samr.gov.cn/bzgk/gb/std_list_type?p.p1=1&p.p90=circulation_date&p.p91=desc')


search_box = driver.find_element(By.XPATH,
                                 '//*[@id="stage"]/div/div[2]/div/div/div/div[2]/table/tbody[2]/tr[1]/td[2]/a')  # 使用 find_element 方法根据 XPath 选择器找到搜索框，并将其赋值给变量 search_box。
search_box.click()  # 点击跳转到下一个页面
time.sleep(2)
# driver.back() # 使用 back 方法返回到上一页，即百度首页

# 窗口之间的切换,切换到第二个窗口
driver.switch_to.window(driver.window_handles[1])

txt = driver.find_element(By.XPATH, "/html/body/div[2]/div/div/div/div/table[2]/tbody/tr[1]/td[1]/b").text
print(txt)

download = driver.find_element(By.XPATH, "/html/body/div[2]/div/div/div/div/table[2]/tbody/tr[4]/td/button[2]")
download.click()
# 记得切换窗口
driver.switch_to.window(driver.window_handles[2])

try:
    element = WebDriverWait(driver, 10).until(
        EC1.presence_of_element_located((By.XPATH, '//*[contains(text(), "钢筋混凝土用钢 第1部分：热轧光圆钢筋")]'))
    )
    element.click()
except Exception as e:
    print("无法找到包含指定文本的元素或点击失败:", e)
    driver.quit()
    exit()
time.sleep(2)
# 这个时候已经出现了带有验证码的窗口
# 如果再次请求验证码的路径，会产生一个新的验证码，是不对的
# 写一个while循环，将识别验证码和检验验证码是否正确结合在一块
Tag = True
while Tag:
    captcha_element = WebDriverWait(driver, 10).until(
        EC1.presence_of_element_located((By.XPATH, '//*[@id="myModal"]/div/div/div[2]/img'))  # 替换为实际的验证码图片的 XPath
    )
    captcha_element.screenshot('captcha.png')  # 把验证码图片保存到本地

    # 使用 ddddocr 识别验证码
    ocr = ddddocr.DdddOcr()
    with open('captcha.png', 'rb') as f:
        captcha_bytes = f.read()
    captcha_text = ocr.classification(captcha_bytes)
    print("识别的验证码:", captcha_text)

    # 输入验证码并点击验证按钮
    captcha_input = driver.find_element(By.XPATH, '//*[@id="verifyCode"]')  # 替换为实际的验证码输入框的 XPath
    captcha_input.send_keys(captcha_text)
    #captcha_input.send_keys("sjdd")
    verify_button = driver.find_element(By.XPATH, '//*[@id="myModal"]/div/div/div[3]/button[2]')
    verify_button.click()

    try:
        WebDriverWait(driver, 5).until(EC1.alert_is_present())
        alert = driver.switch_to.alert
        alert_text = alert.text
        if "验证码不正确" in alert_text:
            print("验证码验证失败，弹窗显示错误提示:", alert_text)
            alert.accept()  # 关闭弹窗
    except TimeoutException:
        print("未检测到错误提示弹窗，验证码验证成功")
        Tag = False


